const handleBlogRouter=require("./src/router/blog")
const handleUserRouter=require("./src/router/user")
const querystring = require("querystring")
const {access} = require("./util/util")

const getCookieExpires=()=>{
  const d=new Date()
  d.setTime(d.getTime()+(24*60*60*1000))
  return d.toGMTString()
}

//存储session的数据
const SESSION_DATA={}


//用于处理postData post数据
//resolve({})的原因在于如果post失败就当get方法处理
const getPostData=(req)=>{
  return new Promise((resolve,reject)=>{
    if(req.method!=="POST"){
      
      resolve({})
      return ;
    }
    if(req.headers['content-type']!=="application/json"){
      
      resolve({})
      return;
    }
    let strData=""
    req.on("data",chunk=>{
      strData+=chunk.toString()
    })
    
    req.on("end",()=>{
      if(!strData){   
        resolve({})
        return
      }
      resolve(JSON.parse(strData))
    })
  })
}

const serverHandle=(req,res)=>{
  //记录access log
  access(`${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()} -- ${req.req.connection.remoteAddress}`)
  
  res.setHeader("Content-Type","application/json")
  
  //处理路径
  const url=req.url
  
  req.path=url.split("?")[0]

  //解析query
  req.query=querystring.parse(url.split("?")[1])

  

  //解析cookie
  req.cookie={}
  const cookieStr=req.headers.cookie || ""
  cookieStr.split(";").forEach(item => {
    if(!item){
      return 
    }else{
      const arr= item.split("=")
      const key = arr[0].trim()
      const value=arr[1]
      req.cookie[key]=value
    }
  });
  
  //session
  //解析session 从cookie中获取cookie 的userid 然后给session
  //是否需要设置cookie 如果有就不需要 没有就需要
  let needSetCookie= false
  let userId=req.cookie.userid
  //这里由于之前将SESSION_DATA[userId]的值{} 赋给了req.session 实际上是赋值的SESSION_DATA[userId]的内存地址
  //这使得当req.session改变的时候 SESSION_DATA[userId]也会一起改变
  //所以后面 req.session.username="zs"时 SESSION_DATA[userId]也会有 username这个属性 且值为zs
  if(userId){
    if(!SESSION_DATA[userId]){
      SESSION_DATA[userId]={}
    }
  }else{
    needSetCookie=true
    const date=new Date()
    userId=`${date.getTime()}_${Math.random()}`
    SESSION_DATA[userId]={}
    

  }
  req.session=SESSION_DATA[userId]
  
  

  //解析post
  getPostData(req).then(async (result)=>{
    
    req.body=result

    const blogData=await handleBlogRouter(req,res)
    
    if(blogData){
      if(needSetCookie){
        res.setHeader("Set-Cookie",`userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
      }
        res.end(JSON.stringify(blogData))
        return ;
    }
    
    
    
  const userData=await handleUserRouter(req,res)
  
  if(userData){
    if(needSetCookie){
      res.setHeader("Set-Cookie",`userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
    }
      res.end(JSON.stringify(userData))
      return ;
  }
    
    
  
  res.writeHead(404,{"Content-Type":"text/plain"})
res.write("404 not found\n")
res.end();

  })
}

//   //处理blog路由
//   const blogData=handleBlogRouter(req,res)

//   if(blogData){
//     res.end(JSON.stringify(blogData))
//   return

//   }


// const userData=handleUserRouter(req,res)
// if(userData){
//   res.end(JSON.stringify(userData))
//   return 
// }
// 当用户进入一个空路由的时候 将响应头改成纯文本 并写上404 not found
// res.writeHead(404,{"Content-Type":"text/plain"})
// res.write("404 not found\n")
// res.end();



module.exports = serverHandle